home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / TABCNTRL.PAK / ABOUT.C next >
C/C++ Source or Header  |  1997-05-06  |  8KB  |  281 lines

  1. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. // PARTICULAR PURPOSE.
  5. //
  6. // Copyright (C) 1993-1995  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  MODULE:   about.c
  9. //
  10. //  PURPOSE:   Displays the "About" dialog box
  11. //
  12. //  FUNCTIONS:
  13. //    CmdAbout        - Displays the "About" dialog box
  14. //    About           - Processes messages for "About" dialog box.
  15. //    MsgAboutInit    - To initialize the about box with version info
  16. //                      from resources.
  17. //    MsgAboutCommand - Process WM_COMMAND message sent to the about box.
  18. //    CmdAboutDone    - Free the about box and related data.
  19. //
  20. //  COMMENTS:
  21. //
  22. //
  23.  
  24. #include <windows.h>            // required for all Windows applications
  25. #include <windowsx.h>
  26.  
  27. #include "globals.h"            // prototypes specific to this application
  28. #include "resource.h"
  29.  
  30.  
  31. LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
  32.  
  33. LRESULT MsgAboutInit(HWND, UINT, WPARAM, LPARAM);
  34. LRESULT MsgAboutCommand(HWND, UINT, WPARAM, LPARAM);
  35. LRESULT CmdAboutDone(HWND, WORD, WORD, HWND);
  36.  
  37. // About dialog message table definition.
  38. MSD rgmsdAbout[] =
  39. {
  40.     {WM_COMMAND,    MsgAboutCommand},
  41.     {WM_INITDIALOG, MsgAboutInit}
  42. };
  43.  
  44. MSDI msdiAbout =
  45. {
  46.     sizeof(rgmsdAbout) / sizeof(MSD),
  47.     rgmsdAbout,
  48.     edwpNone
  49. };
  50.  
  51. // About dialog command table definition.
  52. CMD rgcmdAbout[] =
  53. {
  54.     {IDOK,     CmdAboutDone},
  55.     {IDCANCEL, CmdAboutDone}
  56. };
  57.  
  58. CMDI cmdiAbout =
  59. {
  60.     sizeof(rgcmdAbout) / sizeof(CMD),
  61.     rgcmdAbout,
  62.     edwpNone
  63. };
  64.  
  65. // Module specific "globals"  Used when a variable needs to be
  66. // accessed in more than on handler function.
  67.  
  68. HFONT hFontCopyright;
  69.  
  70. //
  71. //  FUNCTION: CmdAbout(HWND, WORD, WORD, HWND)
  72. //
  73. //  PURPOSE: Displays the "About" dialog box
  74. //
  75. //  PARAMETERS:
  76. //    hwnd      - Window handle
  77. //    wCommand  - IDM_ABOUT (unused)
  78. //    wNotify   - Notification number (unused)
  79. //    hwndCtrl  - NULL (unused)
  80. //
  81. //  RETURN VALUE:
  82. //
  83. //    Always returns 0 - Message handled
  84. //
  85. //  COMMENTS:
  86. //    To process the IDM_ABOUT message, call DialogBox() to display the
  87. //    about dialog box.
  88.  
  89. #pragma argsused
  90. LRESULT CmdAbout(HWND hwnd, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  91. {
  92.     DialogBox(hInst, "AboutBox", hwnd, (DLGPROC)About);
  93.     return 0;
  94. }
  95.  
  96.  
  97. //
  98. //  FUNCTION: About(HWND, UINT, WPARAM, LPARAM)
  99. //
  100. //  PURPOSE:  Processes messages for "About" dialog box.
  101. //
  102. //  PARAMETERS:
  103. //    hdlg - window handle of the dialog box
  104. //    wMessage - type of message
  105. //    wparam - message-specific information
  106. //    lparam - message-specific information
  107. //
  108. //  RETURN VALUE:
  109. //    TRUE - message handled
  110. //    FALSE - message not handled
  111. //
  112. //  COMMENTS:
  113. //
  114. //     Display version information from the version section of the
  115. //     application resource.
  116. //
  117. //     Wait for user to click on "Ok" button, then close the dialog box.
  118. //
  119.  
  120. LRESULT CALLBACK About(HWND hdlg, UINT uMessage, WPARAM wparam, LPARAM lparam)
  121. {
  122.     return DispMessage(&msdiAbout, hdlg, uMessage, wparam, lparam);
  123. }
  124.  
  125.  
  126. //
  127. //  FUNCTION: MsgAboutInit(HWND, UINT, WPARAM, LPARAM)
  128. //
  129. //  PURPOSE: To initialize the about box with version info from resources.
  130. //
  131. //  PARAMETERS:
  132. //    hwnd - The window handing the message.
  133. //    uMessage - The message number. (unused).
  134. //    wparam - Message specific data (unused).
  135. //    lparam - Message specific data (unused).
  136. //
  137. //  RETURN VALUE:
  138. //    Always returns 0 - message handled.
  139. //
  140. //  COMMENTS:
  141. //    Uses the version apis to retrieve version information for
  142. //    each of the static text boxes in the about box.
  143. //
  144.  
  145. #pragma argsused
  146. LRESULT MsgAboutInit(HWND hdlg, UINT uMessage, WPARAM wparam, LPARAM lparam)
  147. {
  148.     #define POINTSIZE 8
  149.  
  150.     char  szFullPath[256];
  151.     DWORD dwVerHnd;
  152.     DWORD dwVerInfoSize;
  153.     HDC   hDC;
  154.      int   iLogPixelsY, iPointSize;
  155.  
  156.     // Center the dialog over the application window
  157.     CenterWindow(hdlg, GetWindow(hdlg, GW_OWNER));
  158.  
  159.      // Set the copyright font to something smaller than default
  160.     hDC = GetDC(hdlg);
  161.     iLogPixelsY = GetDeviceCaps(hDC, LOGPIXELSY);
  162.     ReleaseDC(hdlg, hDC);
  163.     iPointSize = MulDiv(iLogPixelsY, POINTSIZE, 72);
  164.     iPointSize *= -1;
  165.  
  166.     hFontCopyright = CreateFont(iPointSize,
  167.                                           0, 0, 0,
  168.                                 FW_BOLD,
  169.                                 0, 0, 0, 0,
  170.                                 0, 0, 0, 0,
  171.                                 "Arial");
  172.  
  173.     SendDlgItemMessage(hdlg, 
  174.                        IDD_VERLAST, 
  175.                        WM_SETFONT, 
  176.                        (WPARAM)hFontCopyright,
  177.                        0L);
  178.  
  179.     // Get version information from the application
  180.      GetModuleFileName(hInst, szFullPath, sizeof(szFullPath));
  181.     dwVerInfoSize = GetFileVersionInfoSize(szFullPath, &dwVerHnd);
  182.     if (dwVerInfoSize)
  183.     {
  184.         // If we were able to get the information, process it:
  185.           HANDLE  hMem;
  186.         LPVOID  lpvMem;
  187.         char    szGetName[256];
  188.         int     cchRoot;
  189.         int     i;
  190.  
  191.         hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
  192.         lpvMem = GlobalLock(hMem);
  193.           GetFileVersionInfo(szFullPath, dwVerHnd, dwVerInfoSize, lpvMem);
  194.         lstrcpy(szGetName, "\\StringFileInfo\\040904E4\\");
  195.         cchRoot = lstrlen(szGetName);
  196.  
  197.         // Walk through the dialog items that we want to replace:
  198.           for (i = IDD_VERFIRST; i <= IDD_VERLAST; i++)
  199.           {
  200.                 #pragma warn -sus
  201.                 BOOL  fRet;
  202.                 UINT  cchVer = 0;
  203.                 LPSTR lszVer = NULL;
  204.                 char  szResult[256];
  205.  
  206.                 GetDlgItemText(hdlg, i, szResult, sizeof(szResult));
  207.                 lstrcpy(&szGetName[cchRoot], szResult);
  208.                 fRet = VerQueryValue(lpvMem, szGetName, &lszVer, &cchVer);
  209.  
  210.                 if (fRet && cchVer && lszVer)
  211.                 {
  212.                      // Replace dialog item text with version info
  213.                      lstrcpy(szResult, lszVer);
  214.                      SetDlgItemText(hdlg, i, szResult);
  215.                 }
  216.                 #pragma warn .sus
  217.           }
  218.           GlobalUnlock(hMem);
  219.           GlobalFree(hMem);
  220.      }
  221.     return TRUE;
  222. }
  223.  
  224. //
  225. //  FUNCTION: MsgAboutCommand(HWND, UINT, WPARAM, LPARAM)
  226. //
  227. //  PURPOSE: Process WM_COMMAND message sent to the about box.
  228. //
  229. //  PARAMETERS:
  230. //    hwnd - The window handing the message.
  231. //    uMessage - The message number. (unused).
  232. //    wparam - Message specific data (unused).
  233. //    lparam - Message specific data (unused).
  234. //
  235. //  RETURN VALUE:
  236. //    Always returns 0 - message handled.
  237. //
  238. //  COMMENTS:
  239. //    Uses this DipsCommand function defined in wndproc.c combined
  240. //    with the cmdiAbout structure defined in this file to handle
  241. //    the command messages for the about dialog box.
  242. //
  243.  
  244. #pragma argsused
  245. LRESULT MsgAboutCommand(HWND   hwnd,
  246.                                 UINT   uMessage,
  247.                                 WPARAM wparam,
  248.                         LPARAM lparam)
  249. {
  250.     return DispCommand(&cmdiAbout, hwnd, wparam, lparam);
  251. }
  252.  
  253. //
  254. //  FUNCTION: CmdAboutDone(HWND, WORD, HWND)
  255. //
  256. //  PURPOSE: Free the about box and related data.
  257. //
  258. //  PARAMETERS:
  259. //    hwnd - The window handling the command.
  260. //    wCommand - The command to be handled (unused).
  261. //    wNotify   - Notification number (unused)
  262. //    hwndCtrl - NULL (unused).
  263. //
  264. //  RETURN VALUE:
  265. //    Always returns TRUE.
  266. //
  267. //  COMMENTS:
  268. //    Calls EndDialog to finish the dialog session.
  269. //
  270.  
  271. #pragma argsused
  272. LRESULT CmdAboutDone(HWND hdlg, WORD wCommand, WORD wNotify, HWND hwndCtrl)
  273. {
  274.      if (hFontCopyright)
  275.        DeleteObject(hFontCopyright);
  276.  
  277.     EndDialog(hdlg, TRUE);          // Exit the dialog
  278.     return TRUE;
  279. }
  280.  
  281.